package com.cskaoyan.javse.oop2._1extends._10final._3variable._3static;

/**
 * final修饰静态成员变量,表示一个属于类,仅有一份的常量.是真正意义上的常量,在整个类的全局都是常量,所以一般叫它"全局常量".
 * 语法: [访问权限修饰符] static final 数据类型 变量名;
 *
 * 全局常量的默认值也是不能作为常量的值的,需要显式的赋值,方式:
 *      1.静态代码块
 *      2.显式赋值
 * 以上两种赋值方式必须选择其一,而且也只能选择其一.
 * 注意事项:
 *      1.static final还是final static都一样,没有区别.
 *      2.static final的全局常量,在触发类加载时,可能和static修饰的全局变量,有所不同
 *          访问类的全局常量,某些情况不会触发类加载(至少类加载不完全,静态代码块不执行):
 *              1.基本数据类型的全局常量
 *              2.String用字面值常量赋值
 *          但是如果访问引用数据类型new对象的全局常量,静态代码块就会执行
 *     3.final修饰静态成员变量是一个全局常量，不会害怕外界访问和修改。所以在很多时候，它的访问权限修饰符都是public的。
 *
 * @since 16:15
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // System.out.println(Teacher.SALARY);
        // Teacher.SALARY = 20000;
        // System.out.println(Teacher.age);
        System.out.println(Teacher.str);

        // final new Teacher().hashCode();
    }
}

class Teacher {
    final static double SALARY = 20000;
    final static String str = new String("123");
    static int age = 25;

    static {
        System.out.println("Teacher类加载了!");
    }
}
